/** **************************************************************************
 * Type definations
 ****************************************************************************/
type JSApis = 'onMenuShareTimeline'
  | 'onMenuShareAppMessage'
  | 'onMenuShareQQ'
  | 'onMenuShareWeibo'
  | 'onMenuShareQZone'
  | 'startRecord'
  | 'stopRecord'
  | 'onVoiceRecordEnd'
  | 'playVoice'
  | 'pauseVoice'
  | 'stopVoice'
  | 'onVoicePlayEnd'
  | 'uploadVoice'
  | 'downloadVoice'
  | 'chooseImage'
  | 'previewImage'
  | 'uploadImage'
  | 'downloadImage'
  | 'translateVoice'
  | 'getNetworkType'
  | 'openLocation'
  | 'getLocation'
  | 'hideOptionMenu'
  | 'showOptionMenu'
  | 'hideMenuItems'
  | 'showMenuItems'
  | 'hideAllNonBaseMenuItem'
  | 'showAllNonBaseMenuItem'
  | 'closeWindow'
  | 'scanQRCode'
  | 'chooseWXPay'
  | 'openProductSpecificView'
  | 'addCard'
  | 'chooseCard'
  | 'openCard'
  | 'checkJsApi'
  | 'onRecordEnd'
  | 'openWXDeviceLib'
  | 'closeWXDeviceLib'
  | 'configWXDeviceWiFi'
  | 'getWXDeviceInfos'
  | 'sendDataToWXDevice'
  | 'startScanWXDevice'
  | 'stopScanWXDevice'
  | 'connectWXDevice'
  | 'disconnectWXDevice'
  | 'getWXDeviceTicket'
  | 'WeixinJSBridgeReady'
  | 'onWXDeviceBindStateChange'
  | 'onWXDeviceStateChange'
  | 'onScanWXDeviceResult'
  | 'onReceiveDataFromWXDevice'
  | 'onWXDeviceBluetoothStateChange';
  
export interface ConfigOptions {
  /**
   * 开启调试模式,调用的所有api的返回值会在客户端alert出来，若要查看传入的参数，
   * 可以在pc端打开，参数信息会通过log打出，仅在pc端时才会打印。
   */
  debug?: boolean;
  /**
   * 公众号的唯一标识
   */
  appId: string;
  /**
   * 生成签名的时间戳
   */
  timestamp: string | number;
  /**
   * 生成签名的随机串
   */
  nonceStr: string;
  /**
   * 签名
   */
  signature: string;
  /**
   * 需要使用的JS接口列表
   */
  jsApiList: JSApis[] | string[];
  /* beta */
  beta: boolean;
  [x: string]: any;
}

export interface WorkWeixinAgentConfigOptions {
  // 必填，企业微信的corpid，必须与当前登录的企业一致
  corpid: string
  // 必填，企业微信的应用id （e.g. 1000247）
  agentid: string
  // 必填，生成签名的时间戳
  timestamp: string
  // 必填，生成签名的随机串
  nonceStr: string
  // 必填，签名，见附录-JS-SDK使用权限签名算法
  signature: string
  // 必填，传入需要使用的接口名称
  jsApiList: JSApis[] | string[]
  success?: Function
  fail?: Function
}

export interface WorkWeixinPpenEnterpriseChatOptions {
  // !!! 注意：userIds和externalUserIds至少选填一个。内部群最多2000人；外部群最多500人；如果有微信联系人，最多40人
  // 参与会话的企业成员列表，格式为userid1;userid2;， 用分号隔开。
  userIds?: string,
  // 参与会话的外部联系人列表，格式为userId1;userId2;，用分号隔开。
  externalUserIds?: string,
  // 会话名称。单聊时该参数传入空字符串""即可。
  groupName: string,
  // 若要打开已有会话，需指定此参数。如果是新建会话，chatId必须为空串
  chatId: string,
  success: Function
  fail: Function
}

interface WorkWeixinJsApi {
  /**
   * 注入权限验证配置
   * 所有需要使用 JS-SDK 的页面必须先注入配置信息，否则将无法调用。
   * （同一个 url 仅需调用一次，对于变化 url 的 SPA 的 web app 可在每次url变化时进行调用,
   * 目前 Android 微信客户端不支持 pushState 的 H5 新特性，
   * 所以使用 pushState 来实现 web app 的页面会导致签名失败，
   * 此问题会在 Android6.2中修复。）
   */
  config(options: ConfigOptions): void;
  
  /**
   * agentConfig的作用
   * config注入的是企业的身份与权限，而agentConfig注入的是应用的身份与权限。尤其是当调用者为第三方服务商时，通过config无法准确区分出调用者是哪个第三方应用，
   * 而在部分场景下，又必须严谨区分出第三方应用的身份，此时即需要通过agentConfig来注入应用的身份信息。
   * 调用agentConfig的注意事项
   * agentConfig与config的签名算法完全一样，但是jsapi_ticket的获取方法不一样，请特别注意，查看”获取应用身份的ticket“.
   * 调用wx.agentConfig之前，必须确保先成功调用wx.config. 注意：从企业微信3.0.24及以后版本（可通过企业微信UA判断版本号），无须先调用wx.config，可直接wx.agentConfig.
   * 当前页面url中的域名必须是在该应用中设置的可信域名。
   * agentConfig仅在企业微信2.5.0及以后版本支持，微信客户端不支持（微信开发者工具也不支持）
   * 仅部分接口才需要调用agentConfig，需注意每个接口的说明
   */
  agentConfig(options: WorkWeixinAgentConfigOptions): void
  
  /**
   * 处理成功验证
   *
   * config信息验证后会执行ready方法，所有接口调用都必须在config接口获得结果之后，
   * config是一个客户端的异步操作，所以如果需要在页面加载时就调用相关接口，
   * 则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口，
   * 则可以直接调用，不需要放在ready函数中。
   */
  ready(callback: () => void): void;
  
  /**
   * 处理失败验证
   *
   * config信息验证失败会执行error函数，如签名过期导致验证失败，
   * 具体错误信息可以打开config的debug模式查看，也可以在返回的res参数中查看，
   * 对于SPA可以在这里更新签名。
   */
  error(callback: (res: any) => void): void;
  
  openEnterpriseChat(options: WorkWeixinPpenEnterpriseChatOptions): Promise<void>;

  invoke(type: string, options: object, callback: (res: any) => void): void

}

export default WorkWeixinJsApi
